package com.powernode.bank.service.Impl;

import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.pojo.Account;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("i2")
public class IsolationService2 {
    @Resource(name = "accountDao")
    private AccountDao accountDao;

    //2号Service
    //负责insert插入

    @Transactional(timeout = 10)
    //设置事务的超时时间为10s
    //即事务可以运行的最长时间（最后一条DML语句执行之前的时间），而不是超时自动提交
    /**
     * 表示超过10秒如果该事务中所有的DML语句还没有执行完毕的话，最终结果会选择回滚。
     * 默认值-1，表示没有时间限制。
     * 这里有个坑，事务的超时时间指的是哪段时间?
     * 在当前事务当中，最后一条DML语句执行之前的时间。
     * 如果最后一条DML语句后面很有很多业务逻辑，这些业务代码执行的时间不被计入超时时间
     */

    //@Transactional(rollbackFor = RuntimeException.class)
    //只要发生RuntimeException或者这个异常的子类异常，都回滚

    //Transactional(noRollbackFor = NullPointerException.class)
    //表示发生NULLPointerException或该异常的子类不回滚，其他异常回滚
    public void save(Account act){
        accountDao.insert(act);//最后一条DML语句
        //睡眠一会
        //以下代码不会算入超时时间，
        //如果将 睡眠20s 的代码放到insert语句的前面，它就会算到超时时间里
        try {
            Thread.sleep(1000*20);
            //睡20s意思是20s之后这个大括号结束，事务才会提交
            //在这期间我们test，看能不能拿到还未提交的事务
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //如果你想给前面的时间都算上，可以在最后写一条无关紧要的DML语句
    }

}
